#include <cstdio>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <python2.7/Python.h>

using namespace std;

int main() {
	int fd;
	size_t size;
	char text[10000];

	Py_Initialize();
	
	// 必须的，更改环境变量
	PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

	if (Py_IsInitialized() == 0) {
		puts("Py_Initlialize failed");
		return 0;
	}

	/************************************************/
	// 读取一个py文件里面的语句，然后执行
	fd = open("sample.py", O_RDONLY|O_EXCL);
	size = read(fd, text, 10000);
	text[size] = '\0';
	close(fd);

	int res = PyRun_SimpleString(text);
	/************************************************/

	/************************************************/
	// 有些时候我们需要在py文件里面写一些模块
	// 然后调用这些模块，另外我们经常需要传递参数给它们

	PyObject *call = PyImport_ImportModule("call");
	// 下面这两句话和上面的等价
	//PyObject *pName = PyString_FromString("call");
	//PyObject *call = PyImport_Import(pName);
	if (!call) {
		puts("PyImport_ImportModule failed");
		return 0;
	}
	
	// 调用这个函数，这个函数是不需要参数的（传递NULL）
	PyObject *printFunc = PyObject_GetAttrString(call, "printFunc");
	if (!printFunc) {
		puts("PyObject_GetAttrString, printFunc failed");
		return 0;
	}
	PyObject *prun = PyEval_CallObject(printFunc, NULL);
	
	// 调用这个函数，这个函数是需要参数的，也有返回值	
	int a = 1, b = 2, sum = -1;
	PyObject *addFunc = PyObject_GetAttrString(call, "addFunc");
	if (!addFunc) {
		puts("PyObject_GetAttrString addFunc failed");
		return 0;
	}
	// 设置参数
	PyObject *arg = Py_BuildValue("(i,i)", a, b);
	PyObject *result = PyEval_CallObject(addFunc, arg);	
	// 解析返回值
	PyArg_Parse(result, "i", &sum);
	printf("sum = %d\n", sum);
	/************************************************/


	Py_Finalize();
	return 0;
}
